EC-CUBE 2.11.4
[ class tree: EC-CUBE 2.11.4 ] [ index: EC-CUBE 2.11.4 ] [ all elements ]

Source for file LC_Page_Sitemap.php

Documentation is available at LC_Page_Sitemap.php

  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) 2000-2011 LOCKON CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.lockon.co.jp/
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23.  
  24. // {{{ requires
  25. require_once CLASS_EX_REALDIR 'page_extends/LC_Page_Ex.php';
  26.  
  27. /**
  28.  * Sitemapプロトコル ファイル生成モジュール.
  29.  * PHP versions 4 and 5
  30.  *
  31.  * <pre>
  32.  * このモジュールは Sitemapプロトコルに対応した XMLファイルを出力する.
  33.  * EC-CUBE インストールディレクトリの htmlディレクトリへ配置することにより動作する.
  34.  *
  35.  * このモジュールにより, 以下のページのサイトマップが生成される.
  36.  * 1. $staticURL で指定したページ
  37.  * 2. 管理画面のデザイン管理から生成したページ
  38.  * 3. 公開されているすべての商品一覧ページ
  39.  * 4. 公開されているすべての商品詳細ページ
  40.  *
  41.  * このモジュールを設置後, 各検索エンジンにサイトマップを登録することにより, 検索エンジンの
  42.  * インデックス化が促進される.
  43.  * </pre>
  44.  * @see https://www.google.com/webmasters/tools/siteoverview?hl=ja
  45.  * @see https://siteexplorer.search.yahoo.com/mysites
  46.  *
  47.  * @author Kentaro Ohkouchi
  48.  * @version $Id:sitemap.php 15532 2007-08-31 14:39:46Z nanasess
  49.  *
  50.  *  :TODO: 各ページの changefreq や priority を指定できるようにする
  51.  *  :TODO: filemtime 関数を使えば、静的なページの更新時間も取得できそう
  52.  */
  53. class LC_Page_Sitemap extends LC_Page_Ex {
  54.  
  55.     // }}}
  56.     // {{{ properties
  57.  
  58.     /** 動的に生成しないページの配列 */
  59.     var $staticURL;
  60.  
  61.     /** ページリスト */
  62.     var $arrPageList;
  63.  
  64.     // }}}
  65.     // {{{ functions
  66.  
  67.     /**
  68.      * Page を初期化する.
  69.      *
  70.      * @return void 
  71.      */
  72.     function init({
  73.         parent::init();
  74.  
  75.         $this->staticURL = array();
  76.  
  77.         $this->staticURL[HTTP_URL 'rss/' DIR_INDEX_PATH;
  78.     }
  79.  
  80.     /**
  81.      * Page のプロセス.
  82.      *
  83.      * @return void 
  84.      */
  85.     function process({
  86.         // ページのデータを取得
  87.         // FIXME PCサイトのみに限定している。ある程度妥当だとは思うが、よりベターな方法はないだろうか。
  88.         $this->arrPageList = $this->getPageData('device_type_id = ?'DEVICE_TYPE_PC);
  89.  
  90.         $objQuery SC_Query_Ex::getSingletonInstance();
  91.  
  92.         //キャッシュしない(念のため)
  93.         header("Paragrama: no-cache");
  94.  
  95.         //XMLテキスト
  96.         header("Content-type: application/xml; charset=utf-8");
  97.  
  98.         // 必ず UTF-8 として出力
  99.         mb_http_output("UTF-8");
  100.         ob_start('mb_output_handler');
  101.  
  102.         echo '<?xml version="1.0" encoding="UTF-8"?>' "\n";
  103.         echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' "\n";
  104.  
  105.         // TOPページを処理
  106.         $arrTopPagesList $this->getTopPage($this->arrPageList);
  107.         $this->createSitemap($arrTopPagesList[0]['url'],
  108.                              $this->date2W3CDatetime($arrTopPagesList[0]['update_date']),
  109.                              'daily'1.0);
  110.  
  111.         // 静的なページを処理
  112.         foreach ($this->staticURL as $url{
  113.             $this->createSitemap($url'''daily'1.0);
  114.         }
  115.  
  116.         // 編集可能ページを処理
  117.         $arrEditablePagesList $this->getEditablePage($this->arrPageList);
  118.         foreach ($arrEditablePagesList as $arrEditablePage{
  119.             $this->createSitemap($arrEditablePage['url'],
  120.                                  $this->date2W3CDatetime($arrEditablePage['update_date']));
  121.         }
  122.  
  123.         // 商品一覧ページを処理
  124.         $arrProductPagesList $this->getAllProducts();
  125.         foreach ($arrProductPagesList as $arrProductPage{
  126.             $this->createSitemap($arrProductPage['url']'''daily');
  127.         }
  128.  
  129.         // 商品詳細ページを処理
  130.         $arrDetailPagesList $this->getAllDetail();
  131.         foreach ($arrDetailPagesList as $arrDetailPage{
  132.             $this->createSitemap($arrDetailPage['url'],
  133.                                  $this->date2W3CDatetime($arrDetailPage['update_date']));
  134.         }
  135.  
  136.         echo '</urlset>' "\n";
  137.     }
  138.  
  139.     /**
  140.      * デストラクタ.
  141.      *
  142.      * @return void 
  143.      */
  144.     function destroy({
  145.         parent::destroy();
  146.     }
  147.  
  148.     /**
  149.      * Sitemap の <url /> を生成する.
  150.      *
  151.      * @param string $loc ページの URL ※必須
  152.      * @param string $lastmod ファイルの最終更新日 YYYY-MM-DD or W3C Datetime 形式
  153.      * @param string $changefreq ページの更新頻度
  154.      * @param double $priority URL の優先度
  155.      * @return Sitemap 形式の <url />
  156.      * @see https://www.google.com/webmasters/tools/docs/ja/protocol.html#xmlTagDefinitions
  157.      *  TODO Smarty に移行すべき?
  158.      */
  159.     function createSitemap($loc$lastmod ""$changefreq "",
  160.                            $priority ""{
  161.         printf("\t<url>\n");
  162.         printf("\t\t<loc>%s</loc>\n"htmlentities($locENT_QUOTES"UTF-8"));
  163.         if (!empty($lastmod)) {
  164.             printf("\t\t<lastmod>%s</lastmod>\n"$lastmod);
  165.         }
  166.         if (!empty($changefreq)) {
  167.             printf("\t\t<changefreq>%s</changefreq>\n"$changefreq);
  168.         }
  169.         if(!empty($priority)) {
  170.             printf("\t\t<priority>%01.1f</priority>\n"$priority);
  171.         }
  172.         printf("\t</url>\n");
  173.     }
  174.  
  175.     /**
  176.      * TOPページの情報を取得する.
  177.      *
  178.      * @param array $arrPageList すべてのページ情報の配列
  179.      * @return array TOPページの情報
  180.      */
  181.     function getTopPage($arrPageList{
  182.         $arrRet array();
  183.         foreach ($arrPageList as $arrPage{
  184.             if ($arrPage['page_id'== "1"{
  185.                 $arrRet[0$arrPage;
  186.                 return $arrRet;
  187.             }
  188.         }
  189.     }
  190.  
  191.     /**
  192.      * すべての編集可能ページの情報を取得する.
  193.      *
  194.      * @param array $arrPageList すべてのページ情報の配列
  195.      * @return array 編集可能ページ
  196.      */
  197.     function getEditablePage($arrPageList{
  198.         $arrRet array();
  199.         foreach ($arrPageList as $arrPage{
  200.             if ($arrPage['page_id'4{
  201.                 $arrRet[$arrPage;
  202.             }
  203.         }
  204.         return $arrRet;
  205.     }
  206.  
  207.     /**
  208.      * すべての商品一覧ページを取得する.
  209.      *
  210.      * @return array 検索エンジンからアクセス可能な商品一覧ページの情報
  211.      */
  212.     function getAllProducts({
  213.  
  214.         // XXX: 商品登録の無いカテゴリーは除外する方が良い気もする
  215.         $objQuery SC_Query_Ex::getSingletonInstance();
  216.         $sql "SELECT category_id FROM dtb_category WHERE del_flg = 0";
  217.         $result $objQuery->getAll($sql);
  218.  
  219.         $arrRet array();
  220.         foreach ($result as $row{
  221.             // :TODO: カテゴリの最終更新日を取得できるようにする
  222.  
  223.             $arrPage['url'HTTP_URL 'products/list.php?category_id=' $row['category_id'];
  224.             $arrRet[$arrPage;
  225.         }
  226.         return $arrRet;
  227.     }
  228.  
  229.     /**
  230.      * すべての商品詳細ページを取得する.
  231.      *
  232.      * @return array 検索エンジンからアクセス可能な商品詳細ページの情報
  233.      */
  234.     function getAllDetail({
  235.         $objQuery SC_Query_Ex::getSingletonInstance();
  236.         $sql "SELECT product_id, update_date FROM dtb_products WHERE del_flg = 0 AND status = 1";
  237.         $result $objQuery->getAll($sql);
  238.  
  239.         $arrRet array();
  240.         foreach ($result as $row{
  241.  
  242.             $arrPage["update_date"$row['update_date'];
  243.  
  244.             $arrPage['url'HTTP_URL substr(P_DETAIL_URLPATHstrlen(ROOT_URLPATH)) $row['product_id'];
  245.             $arrRet[$arrPage;
  246.         }
  247.         return $arrRet;
  248.     }
  249.  
  250.     /**
  251.      * ブロック情報を取得する.
  252.      *
  253.      * @param string $where WHERE句
  254.      * @param array  $arrVal WHERE句の値を格納した配列
  255.      * @return array $arrPageList ブロック情報
  256.      */
  257.     function getPageData($where ''$arrVal ''){
  258.         $objQuery SC_Query_Ex::getSingletonInstance();     // DB操作オブジェクト
  259.         $sql "";                      // データ取得SQL生成用
  260.         $arrRet array();              // データ取得用
  261.  
  262.         // SQL生成(url と update_date 以外は不要?)
  263.         $sql .= " SELECT";
  264.         $sql .= " page_id";             // ページID
  265.         $sql .= " ,page_name";          // 名称
  266.         $sql .= " ,url";                // URL
  267.         $sql .= " ,filename";           // ファイル名称
  268.         $sql .= " ,header_chk ";        // ヘッダー使用FLG
  269.         $sql .= " ,footer_chk ";        // フッター使用FLG
  270.         $sql .= " ,author";             // authorタグ
  271.         $sql .= " ,description";        // descriptionタグ
  272.         $sql .= " ,keyword";            // keywordタグ
  273.         $sql .= " ,update_url";         // 更新URL
  274.         $sql .= " ,create_date";        // データ作成日
  275.         $sql .= " ,update_date";        // データ更新日
  276.         $sql .= " FROM ";
  277.         $sql .= "     dtb_pagelayout";
  278.  
  279.         // where句の指定があれば追加
  280.         if ($where != ''{
  281.             $sql .= " WHERE " $where;
  282.         }
  283.  
  284.         $sql .= " ORDER BY page_id";
  285.  
  286.         $arrPageList $objQuery->getAll($sql$arrVal);
  287.  
  288.         // URL にプロトコルの記載が無い場合、HTTP_URL を前置する。
  289.         foreach (array_keys($arrPageListas $key{
  290.             $arrPage =$arrPageList[$key];
  291.             if (!preg_match('|^https?://|i'$arrPage['url'])) {
  292.                 $arrPage['url'HTTP_URL $arrPage['url'];
  293.             }
  294.             $arrPage['url'preg_replace('|/' preg_quote(DIR_INDEX_FILE'$|''/' DIR_INDEX_PATH$arrPage['url']);
  295.         }
  296.         unset($arrPage);
  297.  
  298.         return $arrPageList;
  299.     }
  300.  
  301.     /**
  302.      * date形式の文字列を W3C Datetime 形式に変換して出力する.
  303.      *
  304.      * @param date $date 変換する日付
  305.      * @return void 
  306.      */
  307.     function date2W3CDatetime($date{
  308.         $arr array();
  309.         // 正規表現で文字列を抽出
  310.         preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})/",
  311.              $date$arr);
  312.         // :TODO: time zone も取得するべき...
  313.         return sprintf("%04d-%02d-%02dT%02d:%02d:%02d+09:00",
  314.                        $arr[1]$arr[2]$arr[3]$arr[4]$arr[5]$arr[6]);
  315.     }
  316.  
  317. }
  318.  
  319. ?>

Documentation generated on Fri, 24 Feb 2012 14:02:21 +0900 by Seasoft